#include <stdio.h>

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

#include <unistd.h>

int main()
{
    // close(0);
    // close(2);
    
    // 这里关闭了stdout，此时下面打开的log.txt的fd就是1了，但系统可不管，它认为fd是1的就是显示器，所以下面打印的东西就都输出到log.txt里了
    // 这就是输出重定向的现象及原理
    // close(1);   

    umask(0);
    // int fd = open("log.txt", O_WRONLY | O_CREAT | O_TRUNC, 0666);
    // int fd = open("log.txt", O_WRONLY | O_CREAT | O_APPEND);
    
    // 所以可以看出，输出重定向和追加重定向只和打开文件的方式有关，下面演示输入重定向
    
    int fd = open("log.txt", O_RDONLY);
    if(fd < 0)
    {
        perror("open");
        return 1;
    }

    // 输入重定向
    dup2(fd, 0);

    char line[64];

    while(1)
    {
        printf("> ");
        if(fgets(line, sizeof(line) - 1, stdin) == NULL)
        {
            break;
        }
        printf("%s",line);
    }



    // 先来说一下文件描述符fd的分配规则：在文件描述符表中(file_struct指针数组)按从小到大，找到最小的且没有被使用的数组下标
    
    // 但是上面这种关闭文件，再打开的方式太挫了，系统提供了系统调用接口dup2
    // fd -> 1，意思就是把  fd是1的内容  拿  fd是3的内容  覆盖了，此时fd=1的内容就指向fd=3的文件指针了
    // 下面是输出(追加)重定向
    /*
    dup2(fd, 1);


    fprintf(stdout, "log.txt_fd:%d\n", fd);
    printf("log.txt_fd:%d\n", fd);
   
    // 因为stdout和普通文件的刷新策略不同，所以这里要刷新缓冲区，在log.txt才有显示
    fflush(stdout);
    */


    close(fd);
    return 0;
}
